import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import { getTokenTime } from '@/utils/auth'
import router from '@/router'
const timeout = 2 * 3600 * 1000 // 定义失效时间

// 创建axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API // 不同的环境下自动切换不同的基准地址
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    if (store.getters.token) {
      // 前端主动处理
      if (isCheckTimeout()) {
        store.commit('user/logout') // 清数据
        router.push('login') // 跳到登录页
        return Promise.reject(new Error('登录过期'))
      }
      config.headers.Authorization = 'Bearer ' + store.getters.token
    }

    return config
  }
)

// 相应拦截器
service.interceptors.response.use(
  ({ data }) => {
    const { data: res, success, message } = data
    // 真正响应成功后 将数据返回
    if (success) return res
    // 实际上失败后 提示错误信息
    Message.error(message)
    // 返回一个错误 并结束之后的代码
    return Promise.reject(new Error(message))
  },
  err => {
    // 被动处理token过期 判断后端返回的数据
    if (err.response && err.response.status === 401) {
      store.commit('user/logout') // 清数据
      router.push('login') // 跳到登录页
      Message.error('登录过期啦,请重新登录')
    } else {
      Message.error(err.message)
    }
    return Promise.reject(err)
  }
)

// 检查token是否过期
function isCheckTimeout() {
  const tokenTime = getTokenTime()
  const currentTime = Date.now()
  return (currentTime - tokenTime) >= timeout // 判断token有没有过期
}

export default service
